import { HYEventStore } from 'hy-event-store'
import {getSongInfo , getLyricInfo } from '../service/player-api'
import { parsingLyrics } from '../utils/parsing-lyrics'

// 因为在真机上播放歌曲需要切换后台，当前这个api并不能做到
// 所以换成wx.getBackgroundAudioManager()
//创建内部 audio 上下文 InnerAudioContext 对象
// const audioContext = wx.createInnerAudioContext()
const audioContext = wx.getBackgroundAudioManager()

const playerStore = new HYEventStore({
  state:{
    isFirstPlay:true,//是否是第一次播放
    playListSongs: [], //播放歌曲得列表
    playListIndex: 0, //当前播放歌曲得索引
    isPlaying:false,//记录歌曲是否在播放
    modeIndex:0, //播放模式的下标 0: 顺序播放 1: 单曲循环 2: 随机播放
    currentLyric:'', //播放歌曲显示歌词
    lyriIndex:0, 
    currentTime:0,//音频当前播放的时间
    id:0,
    lyricData:[], //歌词数据
    songPlayerInfo:{} , //正在播放的歌曲的数据
    totalTime: 0 //歌曲得总长
  },
  actions:{
    // 请求数据和播放音频
    getSongPlayerStore(ctx,{id}){
      // 判断播放得是不是同一首歌曲得id
      // if(ctx.id==id){
        this.dispatch('changeMusicPlayStatusAction')
      //   return
      // }
      
      // 保存id
      ctx.id = id
     
      //下一首歌曲播放得清除上一首得数据
      ctx.isPlaying = true
      ctx.currentLyric = '' 
      ctx.lyriIndex = 0 
      ctx.currentTime= 0
      ctx.lyricData=[]
      ctx.totalTime = 0 

      // 歌曲详情页页得数据
    getSongInfo(id).then(res=>{
      //获取当前播放的歌曲
      const songPlayerInfo = res.songs[0]
      // 获取总时长
      const totalTime = res.songs[0].dt
      ctx.songPlayerInfo = songPlayerInfo
      ctx.totalTime = totalTime
      audioContext.title = res.songs[0].name
    })

    //请求歌词数据
    getLyricInfo(id).then(res=>{
      const lyric = res.lrc.lyric
      const lyrs = parsingLyrics(lyric)
      ctx.lyricData = lyrs
    })

      //播放音频
      audioContext.stop()//一般开始播放歌曲，要停止播放上一首
      audioContext.src=`https://music.163.com/song/media/outer/url?id=${id}.mp3`
      //音频标题，用于原生音频播放器音频标题（必填）。原生音频播放器中的分享功//能，分享出去的卡片标题，也将使用该值
      audioContext.title= id
      audioContext.autoplay = true //强制播放音频

      //监听audioContext的事件
      //  第一次播放音乐的时候才需要使用监听
      if(ctx.isFirstPlay){
      this.dispatch("setupAudioContextListenerAction")
      ctx.isFirstPlay = false
      }
  },
  
   //audioContext得一些操作
  setupAudioContextListenerAction(ctx) {
     //监听音频可以播放事件
      audioContext.onCanplay(()=>{
          audioContext.play()
      })
       //监听音频播放进度更新事件
       audioContext.onTimeUpdate(()=>{
          // 获取当前音频的播放的时间，单位 s
        const currentTime = audioContext.currentTime * 1000 
        ctx.currentTime = currentTime
  
        //匹配歌词
         for(let i = 0; i< ctx.lyricData.length;i++){ //遍历
          // 判断正在播放的时间是否小于 歌词里的某一句歌词
           if(currentTime < ctx.lyricData[i].time){
             const currentIndex = i-1
             //判断 是不是在播放同一个下标的歌曲
            if(ctx.lyriIndex !== currentIndex){
              // 如果不是就赋值 
             const currentLyric =  ctx.lyricData[currentIndex].text
            //  保存最新播放歌词的下标，
             ctx.currentLyric = currentLyric
             ctx.lyriIndex = currentIndex
            }
            break
          }
         }
       })

       //监听音频自然播放至结束的事件,就播放下一首
       audioContext.onEnded(()=>{
         this.dispatch('changeNewMusicAction')
       })

      //  监听背景音乐的播放，暂停，停止
      audioContext.onPlay(()=>{
        ctx.isPlaying = true
      })
      audioContext.onPause(()=>{
        ctx.isPlaying = false
      })
      audioContext.onStop(()=>{
        ctx.isPlaying = false
      })
      },

   //点击暂停播放，开始播放
  changeMusicPlayStatusAction(ctx,isPlaying=true){
    //从ctx拿到isPlaying得状态时true
    ctx.isPlaying = isPlaying
    //如果isPlaying为true就播放歌曲，反则暂停播放
    ctx.isPlaying ?audioContext.play():audioContext.pause()
  },

  // 切换下一首，上一首
  changeNewMusicAction(ctx,isNext=true){
    let index = ctx.playListIndex

    //首先播放歌曲跟播放模式相关
    //  modeIndex:0, //播放模式的下标 0: 顺序播放 1: 单曲循环 2: 随机播放
    switch(ctx.modeIndex) {
      case 0:
         index = isNext?index+1:index-1
         if(index === -1) index = ctx.playListSongs.length - 1
         if(index === ctx.playListSongs.length) index = 0
         break;
      case 1:
         break;
      case 2:
         index =Math.floor(Math.random()*ctx.playListSongs.length)
 } 
    //这么切换下一首？
    // 首先获取下一首播放歌曲，
    // 然后判断是不是下一首歌
    // 如果是就记录当前播放歌曲的索引
    // 如果不是就把下一首歌赋值给当前播放的歌曲
    let currentSong = ctx.playListSongs[index]
    if(!currentSong){
      currentSong = ctx.songPlayerInfo
    }else{
      ctx.playListIndex=index
    }
    // 播放歌曲,把下一首的歌曲的id传到获取数据方法
    this.dispatch('getSongPlayerStore',({id:currentSong.id}))
  }
  }
})

export {
  audioContext,
  playerStore
}